<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>文件系统 - Shell 编程入门</title>
    <link rel="stylesheet" href="bs.css">
    <link rel="stylesheet" href="reset.css">
</head>
<body>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-12">
            <h1 class="page-header">文件系统</h1>
            <p>
            为了防止未授权用户访问文件，可以在文件和目录上设置权限。
            </p>
            <p>
            创建文件的用户和他(她)所属于的组拥有该文件。文件的属主可以设定谁具有读、写、执行该文件的权限。
            </p>
            <p>就访问方式而言，一个文件具有三种访问方式：</p>
            <ul>
               <li><code>读</code>，可以显示该文件的内容</li> 
               <li><code>写</code>，可以编辑或删除它</li> 
               <li><code>执行</code>，如果该文件是一个 shell 脚本或程序</li> 
            </ul>
            <p>就用户而言，文件权限分三类：</p>
            <ul>
               <li><code>文件属主</code>，创建该文件的用户</li> 
               <li><code>同组用户</code>，拥有该文件的用户组中的任何用户</li> 
               <li><code>其他用户</code>，即不属于拥有该文件的用户组的某一用户</li> 
            </ul>
            
            <h1 class="page-header">文件</h1>
            <p>当创建一个文件的时候，系统保存了有关该文件的全部信息</p>
            <ul>
                <li>文件的位置</li>
                <li>文件类型</li>
                <li>文件长度</li>
                <li>哪位用户拥有该文件，哪些用户可以访问该文件</li>
                <li>i 节点</li>
                <li>文件的修改时间</li>
                <li>文件的权限位</li>
            </ul>
            
            <h1 class="page-header">举例</h1>
            <p>让我们在某个目录中使用<code>ls -l</code>命令来看看结果</p>
<pre>
[root@localhost shells]# ls -l
总用量 8
drwxr-xr-x 2 root root 4096 2月   7 16:09 demo
-rwxrwxrw- 1 root root 1402 3月   1 2017 initapp.sh
</pre>
            <p>下面让我们来分析一下该命令所得结果的前面两行，看看都包含了哪些信息：</p>
            <p><code>总用量 8</code>：这一行告诉我们该目录中所有文件所占的空间 ( linux 计算大小方式比较特殊 并不是直接把大小相加 这里暂不做介绍 )</p>
            <p><code>drwxr-xr-x</code>：这是该文件的权限位。如果除去最前面的 d ，剩余 9 个字符，它们分别对应 9 个权限位。通过这些权限位，可以设定用户对文件的访问权限</p>
            <ul>
                <li><code>rwx</code>：文件属主权限 ( 这是前面三位 )</li>
                <li><code>r-x</code>：同组用户权限 ( 这是中间三位 )</li>
                <li><code>r-x</code>：其他用户权限 ( 这是最后三位 )</li>
            </ul>
            <p><code>2</code>：该文件硬链接的数目</p>
            <p><code>root</code>：文件的属主</p>
            <p><code>root</code>：文件的属主 root 所在的缺省组</p>
            <p><code>1402</code>：用字节来表示的文件长度</p>
            <p><code>2月 7 16:09</code>：文件的更新时间</p>
            <p><code>demo</code>：文件名</p>
            
            <h1 class="page-header">文件类型</h1>
            <p>上面介绍到权限位的时候，我们去掉了一位 d 其实这个符号表示文件类型，文件类型有七种</p>
            <ul>
                <li><code>d</code>：目录</li>
                <li><code>l</code>：符号链接 ( 指向另一个文件 ) </li>
                <li><code>s</code>：套接字文件</li>
                <li><code>b</code>：块设备文件</li>
                <li><code>c</code>：字符设备文件</li>
                <li><code>p</code>：命名管道文件</li>
                <li><code>-</code>：普通文件</li>
            </ul>
            
            <h1 class="page-header">权限</h1>
            <p>上面我们有一个名为 initapp.sh 的文件</p>
            <p><code>-rwxrwxrw- 1 root root 1402 3月   1 2017 initapp.sh</code></p>
            <p>正如上面说到的文件类型，第一个横杠告诉我们它是一个普通文件，其余 9 位每三位分成一组，构成权限位</p>
<pre>
类型    文件属主权限   组用户权限    其他用户权限
-       rwx            rwx            rw-
</pre>
            <p>这三组字符分别定义了不同用户对该文件的权限</p>
            <ul>
                <li>文件属主所拥有的权限</li>
                <li>文件属主缺省组 ( 一个用户可以属于很多个组 ) 所拥有的权限</li>
                <li>系统中其他用户的权限</li>
            </ul>
            <p>在每一组字符中从左到右依次含有三个权限位，含义如下</p>
            <ul>
                <li><code>r</code>：读权限</li>
                <li><code>w</code>：写权限</li>
                <li><code>x</code>：执行权限</li>
            </ul>
            <p>如果权限位某一位为<code>-</code>则表示该位置没有对应的权限</p>
            
            <h2 class="page-header">权限举例</h2>
<pre>
权限             所代表的含义
---------------------------
r-- --- ---      文件属主可读 但不能写和执行
r-- r-- r--      任何用户都可读 但不能写和执行
rwx r-- r--      文件属主可读、写、执行，同组用户和其他用户只可读
</pre>
            
            <h2 class="page-header">修改权限</h2>
            <p>对于属于你的文件，可以按照自己的需要改变其权限位的设置</p>
            <p>可以使用<code>chmod</code>命令来改变文件权限位的设置。这一命令有比较短的<code>绝对模式</code>和长一些的<code>符号模式</code></p>
            
            <h2 class="page-header">符号模式</h2>
            <pre>chmod [who] operator [permission] filename</pre>
            <p>who 含义</p>
            <ul>
                <li><code>u</code>：文件属主权限</li>
                <li><code>g</code>：同组用户权限</li>
                <li><code>o</code>：其他用户权限</li>
                <li><code>a</code>：所有用户 ( 文件属主、同组用户及其他用户 ) </li>
            </ul>
            <p>operator 含义</p>
            <ul>
                <li><code>+</code>：增加权限</li>
                <li><code>-</code>：取消权限</li>
                <li><code>=</code>：设定为某权限</li>
            </ul>
            <p>permission 含义</p>
            <ul>
                <li><code>r</code>：读权限</li>
                <li><code>w</code>：写权限</li>
                <li><code>x</code>：执行权限</li>
                <li><code>s</code>：文件属主和组 set-ID</li>
                <li><code>t</code>：粘性位 *</li>
            </ul>
            <blockquote>
            如果在一个目录上出现<code>t</code>位，这就意味着该目录中的文件只有其属主才可以删除，即使某个同组用户具有和属主同等的权限
            </blockquote>
            
            <h2 class="page-header">符号模式修改权限举例</h2>
            <p>假定 myfile 文件最初具有这样的权限 rwxrwxrwx 依次执行如下命令</p>
<pre>
命令                  结果           所代表的含义
--------------------------------------------------------------
chmod a-x myfile      rw-rw-rw-      收回所有用户的执行权限
chmod og-w myfile     rw-r--r--      收回同组用户和其他用户的写权限
chmod u+x myfile      rwxr--r--      赋予文件属主执行权限
</pre>
            
            <h2 class="page-header">绝对模式</h2>
            <pre>chmod [options] [mode] file</pre>
            <p>其中 mode 是一个八进制数</p>
            <p>八进制数的每一位值都是由读、写、执行三个权限对应的二进制值加起来得到的</p>
            <ul>
                <li><code>r</code>：值为 4</li>
                <li><code>w</code>：值为 2</li>
                <li><code>x</code>：值为 1</li>
            </ul>
            
            <p>计算权限值</p>
            <p>在 UNIX 的实现中 文件权限用 12 个二进制位表示 如果该位置上的值是 1 表示有相应的权限</p>
<pre>
---------------------------------------------------
| 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 位
---------------------------------------------------
| S  | G  | T | r | w | x | r | w | x | r | w | x | 权限
---------------------------------------------------
|             |    user   |   group   |   other   | 用户
---------------------------------------------------
</pre>
            <p>第 11 位为 SUID 位 第 10 位为 SGID 位 第 9 位为 sticky 位</p>
            <p>第 8-0 位分为三组为 所有者 同组用户 其他人权限</p>
<pre>
文件属主       同组用户      所代表的含义
-------------------------------------------
rwx            rwx            rwx
111            111            111          二进制
4+2+1          4+2+1          4+2+1        八进制
</pre>

            <h2 class="page-header">绝对模式修改权限举例</h2>
            <p>假定 myfile 文件最初具有这样的权限 rwxrwxrwx 依次执行如下命令</p>
<pre>
命令                 结果           所代表的含义
--------------------------------------------------------------
chmod 666 myfile     rw-rw-rw-      赋予所有用户读和写的权限
chmod 644 myfile     rw-r--r--      赋予文件属主读和写的权限，所有其他用户读权限
chmod 700 myfile     rwx------      赋予文件属主读、写和执行的权限，所有其他用户无权限
</pre>

            <h2 class="page-header">目录</h2>
            <p>目录的权限位和文件有所不同，如下表</p>
<pre>
r                         w                              x
--------------------------------------------------------------
可以列出该目录中的文件   可以在该目录中创建或删除文件   可以搜索或进入该目录
</pre>
            <ul>
                <li>目录的读权限位意味着可以列出其中的内容</li>
                <li>写权限位意味着可以在该目录中创建文件</li>
                <li>执行权限位则意味着搜索和访问该目录</li>
            </ul>

            <h2 class="page-header">目录权限举例</h2>
<pre>
权限                    文件属主          同组用户          其 他 用 户
-------------------------------------------------------------------------
drwxrwxr-x ( 775 )      读、写、执行      读、写、执行      读、执行
drwxr-xr-- ( 754 )      读、写、执行      读、执行          读
drwxr-xr-x ( 755 )      读、写、执行      读、执行          读、执行
</pre>
            <blockquote>
            如果把用户针对某一目录的权限设置为<code>--x</code>
            那么他们将无法列出该目录中的文件，也无法创建删除文件
            如果该目录中有一个可执行的脚本或程序，只要用户知道它的路径和文件名仍然可以执行它。
            用户不能够进入该目录并不妨碍他的执行操作。
            </blockquote>
            
            <h1 class="page-header">chown 和 chgrp</h1>
            <p>当你创建一个文件时，你就是该文件的属主。一旦你拥有某个文件，就可以改变它的所有权</p>
            <p>一旦将文件的所有权交给另外一个用户，就无法再重新收回它的所有权</p>
            <pre>chown [options] owner file</pre>
            <pre>chgrp [options] group file</pre>
            
            <h1 class="page-header">找出你所属于的用户组</h1>
            <p>如果你希望知道自己属于哪些用户组，可以用如下的命令</p>
<pre>
[root@localhost ~]# id
uid=0(root) gid=0(root) 组=0(root)
</pre>
            
            <h1 class="page-header">umask</h1>
            <p>当最初登录到系统中时，<code>umask</code>命令确定了你创建文件的缺省模式。这一命令实际上和<code>chmod</code>命令正好相反</p>
            <p>在已经登录之后，可以按照个人的偏好使用<code>umask</code>命令来改变文件创建的缺省权限。相应的改变直到退出该 shell 或使用另外的<code>umask</code>命令之前一直有效</p>
            <p>
            一般来说，<code>umask</code>命令是在<code>/etc/profile</code>文件中设置的，
            每个用户在登录时都会引用这个文件，所以如果希望改变所有用户的<code>umask</code>，可以在该文件中加入相应的条目。
            如果希望永久性 地设置自己的<code>umask</code>值，那么就把它放在自己 $HOME 目录下的<code>.profile 或 .bash_profile</code>文件中
            </p>
            
            <h1 class="page-header">计算 umask 值</h1>
            <p><code>umask</code>命令允许你设定文件创建时的缺省模式，对应每一类用户 ( 文件属主、同组用户、 其他用户 ) 存在一个相应的<code>umask</code>值中的数字</p>
            <p>对于文件来说，这一数字的最大值分别是 6 系统不允许你在创建一个文本文件时就赋予它执行权限</p>
            <p>目录则允许设置执行权限，这样针对目录来说，<code>umask</code>中各个数字最大可以到 7</p>
            <pre>umask nnn</pre>
            <ul>
                <li>其中 nnn 为 umask 值 000-777</li>
            </ul>
            <p><code>umask</code>值为 002 那么所对应的文件和目录创建缺省权限分别为 664 和 775</p>
<pre>
umask      文件       目录
---------------------------
0          6          7
1          6          6
2          4          5
3          4          4
4          2          3
5          2          2
6          0          1
7          0          0
</pre>
            
            <h1 class="page-header">符号链接</h1>
            <p>存在两种不同类型的链接，软链接和硬链接</p>
            <p>软链接实际上就是一个指向文件的指针</p>
            
            <h2 class="page-header">使用符号链接来保存文件的多个映像</h2>
            <pre>ln [-s] source_path target_path</pre>
        </div>
    </div>
</div>
</body>
</html>
